﻿using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;

namespace Luka.Log;

public static class HttpRequestExtension
{
    /// <summary>
    /// 定义一个异步方法，用于获取HttpRequest中的查询参数、表单参数和请求体
    /// </summary>
    /// <param name="request">HttpRequest</param>
    /// <returns>查询参数、表单参数和请求体</returns>
    public static async Task<(string Query, string Form, string Body)> GetParams(this HttpRequest request)
    {
        // 定义一个空字符串，用于存储查询参数
        string query = string.Empty;
        // 判断请求中是否有查询参数
        if (request.Query != null && request.Query.Any())
        {
            // 将查询参数转换为字典
            var queryDictionary = request.Query
                .ToDictionary(x => x.Key, x => x.Value.ToString());
            // 将字典转换为JSON字符串
            query = JsonConvert.SerializeObject(queryDictionary);
        }
        // 定义一个空字符串，用于存储表单参数
        string from = string.Empty;
        // 判断请求中是否有表单参数
        if (request.HasFormContentType)
        {
            // 将表单参数转换为字典
            var formDictionary = request.Form
                .ToDictionary(x => x.Key, x => x.Value.ToString());
            // 将字典转换为JSON字符串
            from = JsonConvert.SerializeObject(formDictionary);
        }
        // 定义一个空字符串，用于存储请求体
        string body = string.Empty;
        // 判断请求体是否存在且可读
        if (request.Body != null && request.Body.CanRead)
        {
            // 处理非表单请求体
            // 记录请求体的当前位置
            var originalPosition = request.Body.Position;
            try
            {
                // 将请求体位置重置为0
                request.Body.Position = 0;
                // 读取请求体内容
                body = await new StreamReader(request.Body).ReadToEndAsync();
            }
            finally
            {
                // 将请求体位置恢复到原始位置
                request.Body.Position = originalPosition;
            }
        }
        // 返回查询参数、表单参数和请求体
        return (query, from, body);
    }
}